package bean.dao;

import java.util.List;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import dominio.*;

public class HibernateCotizacionDAO {
	private static HibernateCotizacionDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static HibernateCotizacionDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateCotizacionDAO();
		} 
		return instancia;
	}
	
	private Session getSession(){
		if(session == null || !session.isOpen())
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session.isOpen()) session.close();
	}
	
	public void persistCotizacion(Cotizacion cotizacion){
		Session s=getSession();
		s.beginTransaction();
		s.persist(cotizacion);
		s.flush();
		s.getTransaction().commit();
	}
	
	public void updateCotizacion(Cotizacion cotizacion){
		Session s=getSession();
		s.beginTransaction();
		s.update(cotizacion);
		s.flush();
		s.getTransaction().commit();
	}
	
	public Cotizacion getCotizacion(int numeroCotizacion){
		Session s=getSession();
		s.beginTransaction();
		Cotizacion cotizacion = (Cotizacion)s.get(Cotizacion.class, numeroCotizacion);
		s.getTransaction().commit();
		return cotizacion;
	}
	
	public Cotizacion getCotizacionPorId (int id){
		Session s=getSession();
		Cotizacion coti = (Cotizacion)s.createQuery("select pai from Cotizacion pai where pai.numero= '"+id+"'").uniqueResult();
		return coti;
	}
	
	public SolicitudCotizacion getSolicitudCotizacion(int numeroSolicitud){
		Session s=getSession();
		s.beginTransaction();
		SolicitudCotizacion solicitud = (SolicitudCotizacion)session
								.createQuery("from SolicitudCotizacion where nrosolicitud = :numeroSolicitud ")
								.setParameter("numeroSolicitud", numeroSolicitud)
								.uniqueResult();
		s.getTransaction().commit();
		return solicitud;
	}
	
	public void agregarSolicitudCotizacion(List<SolicitudCotizacion> items){
		Session s= getSession();
		s.beginTransaction();
		for(SolicitudCotizacion sc:items)
			s.persist(sc);
		s.flush();
		s.getTransaction().commit();
	}
	
	public void agregarSolicitud(SolicitudCotizacion sc){
		Session s = getSession();
		s.beginTransaction();
		s.persist(sc);
		s.flush();
		s.getTransaction().commit();
	}

	public int crearCotizacion(Cotizacion c) {
		
		Session s = getSession();
		s.beginTransaction();		
		s.save(c);
		s.flush();
		s.getTransaction().commit();	
		return c.getNumero();
	}

	public ItemListaPrecios buscarMejorItem(Rodamiento r) 
	{
		System.out.println("Buscando el mejor item para cumplir la solicitud para sufijo: "+ r.getSufijo()+", marca: "+ r.getMarca()+", origen: " + r.getOrigen());
		
		Session s=getSession();
		s.beginTransaction();
		List<ItemListaPrecios> items = 
				(List<ItemListaPrecios>) s
				.createQuery("select it from ItemListaPrecios it join it.rodamiento r where r.sufijo = '" + r.getSufijo() + "' and r.marca = '" + r.getMarca() + "' and r.origen = '" + r.getOrigen()+ "' order by it.precio")
				.list();							
		
		s.getTransaction().commit();
		
		ItemListaPrecios item = new ItemListaPrecios();
		
		if(items.size()> 0)
		{
			// El que cumpla el criterio de busqueda y de menor precio.
			item = items.get(0);
		}
		
		return item;
	}

	public void agregarItemListaACotizacion(int itemSolicitudId, int idItemLista) {
		
		if(idItemLista != 0)
		{
			Session s = getSession();
			s.beginTransaction();
			
			ItemSolicitud itemSolicitud =  (ItemSolicitud)s.load(ItemSolicitud.class, itemSolicitudId);
			ItemListaPrecios itemLista =  (ItemListaPrecios)s.load(ItemListaPrecios.class, idItemLista);
			itemSolicitud.setItemLista(itemLista);		
			s.persist(itemSolicitud);
			s.flush();
			s.getTransaction().commit();
		}
		else
		{
			System.out.print("No se encontro un item apropiado para cumplir con lo solicitado");
		}
	}

	public Cotizacion obtenerCotizacion(int numeroCotizacion) {

		Session s = getSession();
		s.beginTransaction();
		Cotizacion c =(Cotizacion) s.get(Cotizacion.class, numeroCotizacion);
		s.flush();
		s.getTransaction().commit();
		return c;
	}

	public List<Cotizacion> obtenerCotizaciones() {

		Session s = getSession();
		s.beginTransaction();
		List<Cotizacion> cotizaciones = (List<Cotizacion>)s.createQuery("select c from Cotizacion c").list();
		s.flush();
		s.getTransaction().commit();
		System.out.println("Cotizaciones obtenidas: " + cotizaciones.size());
		
		return cotizaciones;
	}
}
